關聯式資料庫不僅是大學資料庫課程的使用對象,也是業界的主流選擇。雖然也有非關聯式的(被稱為 NoSQL,如 MongoDB),然而根據筆者觀察,NoSQL 通常是職缺的加分項目,或者與關聯式的 SQL 同為必備項目。因此基本上還是要會 SQL,求職時才能有更多選擇。
接下來的幾篇文章,是筆者複習 MySQL 資料庫的筆記整理,方便日後查閱。也適合以前有學過 SQL,但太久未使用,現在只記得一點點,仍有些概念的讀者。
主要參考的學習資源為以下影片:
我們透過 Docker 啟動 MySQL 的服務。
以下指令會下載 MySQL 8.2.0 版的映像檔,並建立名為「TestMySQL」的容器。而 root 使用者的密碼為「123456」。
docker run --name TestMySQL -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:8.2.0
為了方便撰寫與執行 SQL 指令,可安裝 GUI 工具,筆者使用「Workbench」。
在 SQL 指令撰寫視窗上方的按鈕中,閃電符號代表執行全部或是已反白的指令。閃電符號 + 鍵盤游標代表執行游標所在位置的指令。
mysql-workbench-sql-tab-indicate-execute.png
透過 Workbench 工具,可預先建立一個資料庫,如下圖。
mysql-workbench-create-schema.jpg
而以下是相關的指令,假設資料庫名稱為「company」。
建立資料庫:
CREATE DATABASE `company`;
列出現有資料庫:
SHOW DATABASES;
指定使用資料庫,讓之後執行的指令都作用於它:
USE `company`;
參考影片:
https://www.youtube.com/watch?v=bAwO9fvlEio
|| 型態 || 儲存空間 || 範圍(有符號) || 範圍(無符號) || 對應 Java 型態 ||
|-|-|-|-|-|
|TINYINT|1 byte|-128 ~ 127|0 ~ 255|byte|
|SMALLINT|2 bytes|-32768 ~ 32767|0 ~ 65535|short|
|INT / INTEGER|4 bytes|約正負 21.4 億|0 ~ 約 42.9 億|int|
|BIGINT|8 bytes|正負 2^63|0 ~ 2^64 - 1|long|
|DOUBLE|8 bytes|約正負 1.79E+308|約 2.22E-308 ~ 1.79E+308|double|
|DECIMAL|-|-|-|-|
其中 DECIMAL 比較特別,它具有「精度」(M)與「標度」(D)。宣告方式為 DECIMAL(M, D)
,M 代表該值有幾個數字,D 代表小數點占幾位。
|| 型態 || 占用空間(英、數、半形符號) || 占用空間(其他字) || 是否補空白 ||
|-|-|
|CHAR|1 byte|2 bytes|是|
|VARCHAR|1 byte|2 bytes|否|
|NCHAR|2 bytes|2 bytes|是|
|NVARCHAR|2 bytes|2 bytes|否|
宣告方式為 CHAR(2)
、NVARCHAR(300)
等,會定義位元數。
這四種型態,差別在於是否有「VAR」與「N」。前者代表變動長度,若無 VAR,則當資料未達該長度,會在後方填補半形空白。後者代表是否使用 Unicode 編碼。
固定長度的效能比變動長度來得好,因此如身分證字號、學生學號等固定長度的資料,可採用 CHAR
型態。而姓名、自我介紹等,可考慮 NVARCHAR
型態。
|| 型態 || 範圍 ||
|-|-|
|DATE|1000-01-01 ~ 9999-12-31|
|TIME|-838:59:59 ~ 838:59:59|
|YEAR|1901 ~ 2155|
|DATETIME|1000-01-01 00:00:00 ~ 9999-12-31 23:59:59|
以下指令建立一個儲存員工資料的表,叫做「employee」。
CREATE TABLE `employee` (
`emp_id` INT UNSIGNED,
`name` NVARCHAR(50),
`birthday` DATE,
`gender` CHAR(1),
`salary` INT UNSIGNED
);
若數值欄位已知不會出現負數,則可於型態後方加上 UNSIGNED
,讓值的範圍往正方向平移,相當於正數範圍擴大一倍。
建立後,可確認資料表目前的設計。
DESC `employee`;
DESC
是描述(describe)的意思,指令亦可直接寫 DESCRIBE
。
而刪除資料表的指令如下。
DROP `employee`;
建立資料表時,在資料型態後方可加上一些限制,確保不會存入不合理的資料。
CREATE TABLE `employee` (
`emp_id` INT UNSIGNED AUTO_INCREMENT,
`name` NVARCHAR(50) NOT NULL,
`email` VARCHAR(50) NOT NULL UNIQUE,
`on_board_date` DATE NOT NULL DEFAULT("1970-01-01"),
`gender` CHAR(1) NOT NULL CHECK(`gender` IN ("M", "F")),
`salary` INT UNSIGNED NOT NULL CHECK(`salary` >= 27000),
`dept_id` INT UNSIGNED,
PRIMARY KEY(`emp_id`)
);
以上添加了一些關鍵字。
PRIMARY KEY
:設定主鍵,可給予一至多個欄位。AUTO_INCREMENT
:未來新增資料時,該欄位不必給值,直接讓 MySQL 由 1 開始遞增。NOT NULL
:必填欄位。UNIQUE
:規定資料表中,該欄位的值不可重複。DEFAULT
:設定預設值。亦可搭配函數,如 CURDATE()
(今天日期)。CHECK
:規定欄位值需符合某些條件。寫法如同查詢時的 WHERE
條件子句。假設員工資料表中還要有一個欄位,用來代表部門。現在我們有「branch_id」與「dept_id」這兩個名稱可選擇。
ALTER TABLE `employee` ADD COLUMN `dept_id` TINYINT;
ALTER TABLE `employee` DROP COLUMN `dept_id`;
以下指令是將叫做「dept_id」的欄位,改名為「branch_id」。
ALTER TABLE `employee` RENAME COLUMN `dept_id` TO `branch_id`;
以下指令是將叫做「branch_id」的欄位,更改資料型態為「INT」。
ALTER TABLE `employee` MODIFY COLUMN `branch_id` INT;
以下指令是將叫做「branch_id」的欄位,改名為「dept_id」,且資料型態改為無號「TINYINT」。
ALTER TABLE `employee` CHANGE COLUMN `branch_id` `dept_id` TINYINT UNSIGNED;
今日文章到此結束!
最後宣傳一下自己的部落格,我是「新手工程師的程式教室」的作者,主要發表後端相關文章,請多指教